package cn.tedu.ems.service.impl;

import cn.tedu.ems.ex.ServiceException;
import cn.tedu.ems.mapper.CourseMapper;
import cn.tedu.ems.pojo.dto.CourseAddNewDTO;
import cn.tedu.ems.pojo.dto.CourseUpdateDTO;
import cn.tedu.ems.pojo.entity.Course;
import cn.tedu.ems.pojo.vo.CourseListItemVO;
import cn.tedu.ems.pojo.vo.CourseStandardVO;
import cn.tedu.ems.service.ICourseService;
import cn.tedu.ems.web.ServiceCode;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * 处理课程业务接口的实现类
 */
@Service
@Slf4j
public class CourseServiceImpl implements ICourseService {
    @Autowired
    CourseMapper courseMapper;

    public CourseServiceImpl(){
        log.debug("创建业务对象：CourseServiceImpl");
    }

    /**
     * 添加课程
     * @param courseAddNewDTO 添加课程的DTO类
     */
    @Override
    public void addNew(CourseAddNewDTO courseAddNewDTO) {
        log.debug("开始处理【添加课程】的业务,参数:{}",courseAddNewDTO);

        log.debug("检查名称是否被占用");
        String name = courseAddNewDTO.getName();
        int count = courseMapper.countByName(name);
        if (count > 0){
            String message = "添加失败，该名称已被占用！";
            log.debug(message);
            throw new ServiceException(ServiceCode.ERROR_CONFLICT,message);
        }
        Course course = new Course();
        BeanUtils.copyProperties(courseAddNewDTO,course);
        log.debug("即将插入课程数据:{}",course);
        int row = courseMapper.insert(course);
        if (row !=1){
            String message = "添加失败，服务器忙，请稍后再试！";
            log.debug(message);
            throw new ServiceException(ServiceCode.ERR_INSERT,message);
        }
    }

    /**
     * 根据id删除课程
     * @param id 课程id
     */
    @Override
    public void delete(Long id) {
        log.debug("开始处理【根据id删除课程】的业务,参数:{}",id);
        CourseStandardVO queryResult = courseMapper.getStandardById(id);
        if (queryResult == null) {
            String message = "删除课程失败，尝试访问的数据不存在！";
            log.debug(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message);
        }

        log.debug("即将执行删除，参数：{}", id);
        int rows = courseMapper.deleteById(id);
        if (rows != 1) {
            String message = "删除课程失败，服务器忙，请稍后再尝试！";
            log.debug(message);
            throw new ServiceException(ServiceCode.ERR_DELETE, message);
        }
    }


    /**
     * 修改课程详情
     * @param id 课程id
     * @param courseUpdateDTO 新数据
     */
    @Override
    public void updateById(Long id, CourseUpdateDTO courseUpdateDTO) {
        log.debug("开始处理【根据修改课程详情】的业务，参数ID:{}，新数据：{}",id,courseUpdateDTO);
        //查询该课程是否存在
        CourseStandardVO queryResult = courseMapper.getStandardById(id);
        if (queryResult == null) {
            String message = "修改课程失败，尝试访问的数据不存在！";
            log.debug(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message);
        }
        //检查名称是否被占用
        String name = courseUpdateDTO.getName();
        int count = courseMapper.countByNameAndNotId(id,name);
        if (count > 0){
            String message = "修改失败，该名称已被占用！";
            log.debug(message);
            throw new ServiceException(ServiceCode.ERROR_CONFLICT,message);
        }

        Course course = new Course();
        BeanUtils.copyProperties(courseUpdateDTO,course);
        course.setId(id);

        log.debug("即将修改课程数据:{}",course);
        int row = courseMapper.update(course);
        if (row !=1){
            String message = "修改失败，服务器忙，请稍后再试！";
            log.debug(message);
            throw new ServiceException(ServiceCode.ERR_UPDATE,message);
        }
    }

    /**
     * 查询课程列表
     * @return 课程列表
     */
    @Override
    public List<CourseListItemVO> list() {
        log.debug("开始处理【查询课程列表】的业务，无参数");
        return courseMapper.list();
    }

    /**
     * 根据id查询课程详情
     * @param id 课程id
     * @return 匹配的课程详情
     */
    @Override
    public CourseStandardVO getStandardById(Long id) {
        log.debug("开始处理【根据id查询课程详情】的业务,参数:{}",id);
        CourseStandardVO result = courseMapper.getStandardById(id);
        if (result == null){
            String message = "查询失败，尝试访问的数据不存在！";
            log.debug(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND,message);
        }
        return result;
    }

    /**
     * 根据搜索词查询课程详情
     * @param wd 搜索词
     * @return 匹配的课程详情
     */
    @Override
    public List<CourseStandardVO> getStandardByWd(String wd) {
        log.debug("开始处理【根据搜索词查询课程详情】的业务，参数：{}",wd);
        List<CourseStandardVO> list = courseMapper.getStandardByWd(wd);
        if (list == null){
            String message = "查询失败，尝试访问的数据不存在！";
            log.debug(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND,message);
        }
        return list;
    }
}
